#ifndef GUIENGINE_H_
#define GUIENGINE_H_

#include "app/InputEvent.h"
#include "gui/objects/GUIObject.h"
#include "gui/SurfaceFactory.h"
#include "util/LinkedList.h"

#include <string>
#include <SDL/SDL.h>

namespace gui {

/*
 * Es el motor que se comunica con SDL, ya sea para la graficacion como para la
 * captura de eventos.
 */
class GUIEngine {
public:
	/* Constructor.*/
	GUIEngine(int width, int height, int bpp, std::string caption, bool fullScreen);

	/* Destructor. */
	virtual ~GUIEngine();

	/* Inicializa el motor de la interfaz grafica. */
	virtual bool start(bool splashScreen);

	/* Detiene momentaneamente el motor de la interfaz grafica. */
	virtual void stop();

	/* Limpia la pantalla. */
	virtual void clearScreen();

	/*Dibuja una superficie en la pantalla*/
	virtual void drawSurface(Surface* surface);

	/* Recupera eventos pendientes. */
	virtual int pollEvent(InputEvent* event);

	/* Espera el siguiente evento. */
	virtual int waitEvent(InputEvent* event);

	/* Crea un SurfaceFactory (deberia ser la unica forma de crear instancias de Surface) */
	virtual SurfaceFactory* getSurfaceFactory();

private:
	int rColor;
	int gColor;
	int bColor;
	int screenBPP;
	bool fullScreen;
	std::string screenCaption;

	// Definicion del ancho, alto, y posición actual de la pantalla
	SDL_Rect screenRect;
	// Pantalla vista por el usuario
	SDL_Surface* screen;
	SurfaceFactory* surfaceFactory;

	double xScale;
	double yScale;

	void refreshScreen();

	void drawSurface(SDL_Surface* surface, SDL_Rect* position);

	void showSplash();

};

}

#endif
